﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Libreria.SIG.Modelo;
using Libreria.SIG.ServiciosRFID;

namespace Libreria.SIG.Negocio
{
    public class VentaNegocio
    {
        public List<Venta> consultarVentas(Int32 codigo, String cadenaDeConexion)
        {
            List<Venta> Ventas = new List<Venta>();
            Venta listaDeVentas = new Venta(cadenaDeConexion);
            if (codigo > 0)
            {
                Ventas.Add(listaDeVentas.consultarPorCodigo(codigo));
            }
            else
            {
                Ventas = listaDeVentas.consultar();
            }
            return Ventas;
        }

        public List<Venta> consultarVentasDelDia(DateTime fecha, String identificadorUsuario, String cadenaDeConexion)
        {
            MenuNegocio menu = new MenuNegocio();
            List<Menu> menuDelDia = menu.ConsultaMenusVigentesPorFecha(fecha, cadenaDeConexion);

            PedidoNegocio pedido = new PedidoNegocio();
            List<Pedido> pedidosDelDia = new List<Pedido>();

            foreach (var item in menuDelDia)
            {
                int codigoItem = Int16.Parse(item.Codigo.ToString());
                pedidosDelDia.AddRange(pedido.consultarPedidosPorMenu(codigoItem, cadenaDeConexion));
            }

            List<Venta> Ventas = new List<Venta>();
            Venta listaDeVentas = new Venta(cadenaDeConexion);
            foreach (var item in pedidosDelDia)
            {
                listaDeVentas.Codigo = item.CodigoVenta;
                if (!string.IsNullOrEmpty(identificadorUsuario))
                {
                    listaDeVentas.IdentificadorUsuario = identificadorUsuario;
                }
                else
                {
                    listaDeVentas.IdentificadorUsuario = null;
                }
                listaDeVentas.ValorCompra = null;
                listaDeVentas.FechaCompra = DateTime.MinValue;
                listaDeVentas.FechaVenta = DateTime.MinValue;
                listaDeVentas.PorTiquete = null;
                listaDeVentas.PorInternet = null;
                listaDeVentas.EsReserva = null;
                listaDeVentas.Pagado = null;
                listaDeVentas.Entregado = null;
                Ventas.AddRange(listaDeVentas.consultar());
            }

            return Ventas;
        }

        public List<Venta> consultarVentasDelDiaConPersonas(DateTime fecha, String cadenaDeConexion)
        {
            MenuNegocio menu = new MenuNegocio();
            List<Menu> menuDelDia = menu.ConsultaMenusVigentesPorFecha(fecha, cadenaDeConexion);

            PedidoNegocio pedido = new PedidoNegocio();
            List<Pedido> pedidosDelDia = new List<Pedido>();

            foreach (var item in menuDelDia)
            {
                int codigoItem = Int16.Parse(item.Codigo.ToString());
                pedidosDelDia.AddRange(pedido.consultarPedidosPorMenu(codigoItem, cadenaDeConexion));
            }

            List<Venta> Ventas = new List<Venta>();
            Venta listaDeVentas = new Venta(cadenaDeConexion);
            foreach (var item in pedidosDelDia)
            {
                listaDeVentas.IdentificadorUsuario = null;
                listaDeVentas.CodigoMenu = null;
                listaDeVentas.ValorCompra = null;
                listaDeVentas.FechaCompra = DateTime.MinValue;
                listaDeVentas.FechaVenta = DateTime.MinValue;
                listaDeVentas.PorTiquete = null;
                listaDeVentas.PorInternet = null;
                listaDeVentas.EsReserva = null;
                listaDeVentas.Pagado = null;
                listaDeVentas.Entregado = null;
                Ventas.AddRange(listaDeVentas.consultar());
            }

            ExternoNegocio en = new ExternoNegocio();
            List<Persona> personas = en.consultarUsuarios(null, false, null, cadenaDeConexion);

            foreach (var item in Ventas)
            {
                string codigo = item.IdentificadorUsuario;
                Persona per = (Persona)(from p in personas
                                        where p.Codigo.Value.ToString().Equals(codigo)
                                        select p);
                item.IdentificadorUsuario = per.NumeroDeDocumento + " - " + per.Apellido + ", " + per.Nombre;

            }
            return Ventas;
        }

        public List<Venta> consultarVentasDeUsuario(String codigoUsuario, String cadenaDeConexion)
        {
            List<Venta> Ventas = new List<Venta>();
            if (codigoUsuario != null)
            {
                Venta listaDeVentas = new Venta(cadenaDeConexion);
                listaDeVentas.IdentificadorUsuario = codigoUsuario;
                Ventas = listaDeVentas.consultar();
            }
            return Ventas;
        }

        public void eliminarVenta(Int32 Codigo, String cadenaDeConexion)
        {
            try
            {
                Tiquete tiquete = new Tiquete(cadenaDeConexion);
                tiquete.CodigoVenta = Codigo;
                List<Tiquete> tiquetes = tiquete.consultar();
                foreach (Tiquete tiqueteAActualizar in tiquetes)
                {
                    Tiquete actualizaTiquete = new Tiquete(cadenaDeConexion);
                    actualizaTiquete.Codigo = tiqueteAActualizar.Codigo;
                    actualizaTiquete.FechaCompra = tiqueteAActualizar.FechaCompra;
                    actualizaTiquete.ValorTiquete = tiqueteAActualizar.ValorTiquete;
                    actualizaTiquete.IdentificadorUsuario = tiqueteAActualizar.IdentificadorUsuario;
                    actualizaTiquete.CodigoVenta = null;
                    actualizaTiquete.actualizarCompra();
                }

                Venta VentaAEliminar = new Venta(cadenaDeConexion);
                VentaAEliminar.Codigo = Codigo;
                VentaAEliminar.ValorCompra = null;
                VentaAEliminar.FechaCompra = new DateTime();
                VentaAEliminar.FechaVenta = new DateTime();
                VentaAEliminar.PorTiquete = null;
                VentaAEliminar.IdentificadorUsuario = null;
                VentaAEliminar.CodigoMenu = null;
                VentaAEliminar.EsReserva = null;
                VentaAEliminar.Pagado = null;
                VentaAEliminar.Entregado = null;
                VentaAEliminar.PorInternet = null;
                VentaAEliminar.eliminar();

            }
            catch (Exception)
            {
                
            }
        }

        [Obsolete("Este método se deprecio, ya que se agregó los campos pagado y entregado.", true)]
        public void actualizarVenta(Int32 Codigo, Double ValorCompra, DateTime FechaCompra, DateTime FechaVenta, Boolean PorTiquete, String IdentificadorUsuario, Boolean EsReserva, Boolean PorInternet, String cadenaDeConexion)
        {
            actualizarVenta(Codigo, ValorCompra, FechaCompra, FechaVenta, PorTiquete, IdentificadorUsuario, EsReserva, PorInternet, false, false, cadenaDeConexion);
        }

        [Obsolete("Este método se deprecio, ya que se agregó el campo código menu.", true)]
        public void actualizarVenta(Int32 Codigo, Double ValorCompra, DateTime FechaCompra, DateTime FechaVenta, Boolean PorTiquete, String IdentificadorUsuario, Boolean EsReserva, Boolean PorInternet, Boolean Pagado, Boolean Entregado, String cadenaDeConexion)
        {
            actualizarVenta(Codigo, ValorCompra, FechaCompra, FechaVenta, PorTiquete, IdentificadorUsuario, 0, EsReserva, PorInternet, Pagado, Entregado, cadenaDeConexion);
        }

        public void actualizarVenta(Int32 Codigo, Double ValorCompra, DateTime FechaCompra, DateTime FechaVenta, Boolean PorTiquete, String IdentificadorUsuario, int codigoMenu, Boolean EsReserva, Boolean PorInternet, Boolean Pagado, Boolean Entregado, String cadenaDeConexion)
        {
            Venta VentaAActualizar = new Venta(cadenaDeConexion);
            VentaAActualizar.Codigo = Codigo;
            VentaAActualizar.ValorCompra = ValorCompra;
            VentaAActualizar.FechaCompra = FechaCompra;
            VentaAActualizar.FechaVenta = FechaVenta;
            VentaAActualizar.PorTiquete = PorTiquete;
            VentaAActualizar.IdentificadorUsuario = IdentificadorUsuario;
            VentaAActualizar.CodigoMenu = codigoMenu;
            VentaAActualizar.EsReserva = EsReserva;
            VentaAActualizar.Pagado = Pagado;
            VentaAActualizar.Entregado = Entregado;
            VentaAActualizar.PorInternet = PorInternet;
            VentaAActualizar.actualizar();
        }

        public void VentaPagada(Int32 Codigo, Boolean Pagado, String cadenaDeConexion)
        {
            List<Venta> venta = consultarVentas(Codigo, cadenaDeConexion);
            if (venta.Count == 1)
            {
                Venta VentaAActualizar = new Venta(cadenaDeConexion);
                VentaAActualizar.Codigo = Codigo;
                VentaAActualizar.ValorCompra = venta[0].ValorCompra;
                VentaAActualizar.FechaCompra = venta[0].FechaCompra;
                VentaAActualizar.FechaVenta = venta[0].FechaVenta;
                VentaAActualizar.PorTiquete = venta[0].PorTiquete;
                VentaAActualizar.IdentificadorUsuario = venta[0].IdentificadorUsuario;
                VentaAActualizar.CodigoMenu = venta[0].CodigoMenu;
                VentaAActualizar.EsReserva = venta[0].EsReserva;
                VentaAActualizar.Pagado = Pagado;
                VentaAActualizar.Entregado = venta[0].Entregado;
                VentaAActualizar.PorInternet = venta[0].PorInternet;
                VentaAActualizar.actualizar();
            }
        }

        public void VentaEntregada(Int32 Codigo, Boolean Entregado, String cadenaDeConexion)
        {
            List<Venta> venta = consultarVentas(Codigo, cadenaDeConexion);
            if (venta.Count == 1)
            {
                Venta VentaAActualizar = new Venta(cadenaDeConexion);
                VentaAActualizar.Codigo = Codigo;
                VentaAActualizar.ValorCompra = venta[0].ValorCompra;
                VentaAActualizar.FechaCompra = venta[0].FechaCompra;
                VentaAActualizar.FechaVenta = venta[0].FechaVenta;
                VentaAActualizar.PorTiquete = venta[0].PorTiquete;
                VentaAActualizar.IdentificadorUsuario = venta[0].IdentificadorUsuario;
                VentaAActualizar.CodigoMenu = venta[0].CodigoMenu;
                VentaAActualizar.EsReserva = venta[0].EsReserva;
                VentaAActualizar.Pagado = venta[0].Pagado;
                VentaAActualizar.Entregado = Entregado;
                VentaAActualizar.PorInternet = venta[0].PorInternet;
                VentaAActualizar.actualizar();
            }
        }

        [Obsolete("Este método se deprecio, ya que se agregó los campos pagado y entregado.", true)]
        public void crearVenta(Int32 Codigo, Double ValorCompra, DateTime FechaCompra, DateTime FechaVenta, Boolean PorTiquete, String IdentificadorUsuario, Boolean EsReserva, Boolean PorInternet, String cadenaDeConexion, out String mensaje)
        {
            crearVenta(Codigo, ValorCompra, FechaCompra, FechaVenta, PorTiquete, IdentificadorUsuario, 0, EsReserva, PorInternet, false, false, cadenaDeConexion, out mensaje);
        }

        [Obsolete("Este método se deprecio, ya que se agregó el campo código menu.", true)]
        public void crearVenta(Int32 Codigo, Double ValorCompra, DateTime FechaCompra, DateTime FechaVenta, Boolean PorTiquete, String IdentificadorUsuario, Boolean EsReserva, Boolean PorInternet, Boolean Pagado, Boolean Entregado, String cadenaDeConexion, out String mensaje)
        {
            crearVenta(Codigo, ValorCompra, FechaCompra, FechaVenta, PorTiquete, IdentificadorUsuario, 0, EsReserva, PorInternet, Pagado, Entregado, cadenaDeConexion, out mensaje);
        }

        public void crearVenta(Int32 Codigo, Double ValorCompra, DateTime FechaCompra, DateTime FechaVenta, Boolean PorTiquete, String IdentificadorUsuario, int CodigoMenu, Boolean EsReserva, Boolean PorInternet, Boolean Pagado, Boolean Entregado, String cadenaDeConexion, out String mensaje)
        {

            mensaje = "";
            Venta VentaACrear = new Venta(cadenaDeConexion);
            if (ValorCompra >= 0)
            {
                VentaACrear.Codigo = null;
                VentaACrear.ValorCompra = ValorCompra;
                VentaACrear.FechaCompra = FechaCompra;
                VentaACrear.FechaVenta = DateTime.Now;
                VentaACrear.PorTiquete = PorTiquete;
                VentaACrear.IdentificadorUsuario = IdentificadorUsuario;
                VentaACrear.CodigoMenu = CodigoMenu;
                VentaACrear.EsReserva = EsReserva;
                VentaACrear.PorInternet = PorInternet;
                VentaACrear.Pagado = Pagado;
                VentaACrear.Entregado = Entregado;
                VentaACrear.crear();

                if (PorTiquete)
                {
                    Tiquete tiquete = new Tiquete(cadenaDeConexion);
                    List<Tiquete> listaTiquetesDisponible = new List<Tiquete>();
                    listaTiquetesDisponible = tiquete.consultarDisponiblesPorIdentificadorUsuario(IdentificadorUsuario);
                    Double pagado = 0;
                    Int32 numeroTiquete = 0;
                    if (listaTiquetesDisponible.Count > 0)
                    {
                        TiqueteNegocio tiqueteAAsignar = new TiqueteNegocio();
                        while (pagado < ValorCompra)
                        {
                            tiqueteAAsignar.asignarTiqueteAVenta((Int32)listaTiquetesDisponible[numeroTiquete].Codigo, (Int32)VentaACrear.Codigo, cadenaDeConexion);
                            pagado += listaTiquetesDisponible[numeroTiquete].ValorTiquete.Value;
                            numeroTiquete++;
                        }
                    }
                }
            }
            else
            {
                mensaje = "Compra no realizada reintente ";
            }
  
        }

    }
}
